package cn.cai.listener;

import cn.cai.exceptionHandler.GuliException;
import cn.cai.pojo.EduSubject;
import cn.cai.pojo.excell.SubjectExcelData;
import cn.cai.service.IEduSubjectService;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;


public class SubjectReadListener extends AnalysisEventListener<SubjectExcelData> {
    //因为要在本类中对数据进行插入（插入到数据库），所以要将本类交由spring管理（@Component）
    //因为要操作数据库，所以要注入Mapper层DAO类
    private IEduSubjectService subjectService;
    public SubjectReadListener() {
    }
    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     */
    public SubjectReadListener(IEduSubjectService subjectService) {
        this.subjectService = subjectService;
    }

    /**
     * 每读一行，就执行一次该方法
     * @param data
     * @param context
     */
    @Override
    public void invoke(SubjectExcelData data, AnalysisContext context) {
        //先对每行的数据进行简单的判断
        if (data == null){
            throw  new GuliException(20001,"Excel表中不能存在空行");
        }
        //判断第一列的数据，即一级分类，是否存在，已存在就不用添加了
        EduSubject fatherTab = this.findFatherTab(data.getSubjectOneData());
        if (fatherTab == null){
            //数据库中没有，需要添加
            fatherTab = new EduSubject();
            fatherTab.setTitle(data.getSubjectOneData());
            //一级标签的parent_id为0
            fatherTab.setParentId("0");
            subjectService.save(fatherTab);
        }
        //判断第二列的数据，判断该标签是否已经存在，并且它的父id是否已经存在
        EduSubject childTab = findChildTab(data.getSubjectTwoData(), fatherTab.getId());
        if (childTab == null){
            //数据库中没有该数据，需要添加
            childTab = new EduSubject();
            //设置二级分类名
            childTab.setTitle(data.getSubjectTwoData());
            //设置二级分类所属的一级分类的id
            childTab.setParentId(fatherTab.getId());
            //添加到数据库
            subjectService.save(childTab);
        }
    }

    /**
     * 查询第一行数据（一级分类）是否存在
     * @param name 对应数据库中的title
     * @return 查询出的对象  不存在为空  存在为该实例
     * */
    private EduSubject findFatherTab(String name) {
        //创建自定义查询 于数据库交互。虽然很耗性能，强烈不建议，但是为了跟老师的一样
        QueryWrapper<EduSubject> queryWrapper = new QueryWrapper<EduSubject>();
        queryWrapper.eq("title", name);
        queryWrapper.eq("parent_id", "0");
        return subjectService.getOne(queryWrapper);
    }

    /**
     * 查询数据库中是否已经存在该名字的二级标签
     * @param name
     * @param pid
     * @return
     */
    private EduSubject findChildTab(String name,String pid){
        //创建自定义查询  与数据库进行交互
        QueryWrapper<EduSubject> queryWrapper = new QueryWrapper<>();
        //添加自己定义的查询条件
        queryWrapper.eq("title",name);
        queryWrapper.eq("parent_id",pid);
        //返回查询出来的结果
        return subjectService.getOne(queryWrapper);

    }

    /**
     * 在读取完最后一行时，执行该方法
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    }
}
